home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / ui / scroll.c < prev    next >
C/C++ Source or Header  |  1998-08-08  |  7KB  |  239 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13.  
  14. #include <stdlib.h>
  15.  
  16. #include "fix.h"
  17. #include "types.h"
  18. #include "gr.h"
  19. #include "ui.h"
  20. #include "key.h"
  21. #include "timer.h"
  22.  
  23. void ui_draw_scrollbar( UI_GADGET_SCROLLBAR * scrollbar )
  24. {
  25.     int x, y;
  26.  
  27.     if (scrollbar->status==0)
  28.         return;
  29.  
  30.     scrollbar->status = 0;
  31.     x = y = 0;
  32.     ui_mouse_hide();
  33.     gr_set_current_canvas( scrollbar->canvas );
  34.  
  35.     if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)scrollbar)
  36.         gr_setcolor( CRED );
  37.     else
  38.         gr_setcolor( CGREY );
  39.  
  40.     gr_rect( 0, 0, scrollbar->width-1, scrollbar->fake_position-1 );
  41.     gr_rect( 0, scrollbar->fake_position+scrollbar->fake_size, scrollbar->width-1, scrollbar->height-1);
  42.  
  43.     ui_draw_box_out(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
  44.  
  45.     ui_mouse_show();
  46.  
  47. }
  48.  
  49. UI_GADGET_SCROLLBAR * ui_add_gadget_scrollbar( UI_WINDOW * wnd, short x, short y, short w, short h, int start, int stop, int position, int window_size  )
  50. {
  51.     int tw, th, taw;
  52.  
  53.     UI_GADGET_SCROLLBAR * scrollbar;
  54.     char up[2];
  55.     char down[2];
  56.     up[0] = 30; up[1] = 0;
  57.     down[0] = 31; down[1] = 0;
  58.  
  59.     gr_get_string_size( up, &tw, &th, &taw );
  60.  
  61.     w = tw + 10;
  62.  
  63.     if (stop < start ) stop = start;
  64.  
  65.     scrollbar = (UI_GADGET_SCROLLBAR *)ui_gadget_add( wnd, 3, x, y+w, x+w-1, y+h-w-1 );
  66.  
  67.     scrollbar->up_button = ui_add_gadget_button( wnd, x, y, w, w, up, NULL );
  68.     scrollbar->up_button->parent = (UI_GADGET *)scrollbar;
  69.  
  70.     scrollbar->down_button =ui_add_gadget_button( wnd, x, y+h-w, w, w, down, NULL );
  71.     scrollbar->down_button->parent = (UI_GADGET *)scrollbar;
  72.  
  73.     scrollbar->horz = 0;
  74.     scrollbar->width = scrollbar->x2-scrollbar->x1+1;
  75.     scrollbar->height = scrollbar->y2-scrollbar->y1+1;
  76.     scrollbar->start = start;
  77.     scrollbar->stop = stop;
  78.     scrollbar->position = position;
  79.     scrollbar->window_size = window_size;
  80.     scrollbar->fake_length = scrollbar->height;
  81.     scrollbar->fake_position =  0;
  82.     if (stop!=start)
  83.         scrollbar->fake_size = (window_size * scrollbar->height)/(stop-start+1+window_size);
  84.     else
  85.         scrollbar->fake_size = scrollbar->height;
  86.  
  87.     if (scrollbar->fake_size < 7) scrollbar->fake_size = 7;
  88.     scrollbar->dragging = 0;
  89.     scrollbar->moved=0;
  90.     scrollbar->last_scrolled = 0;
  91.     return scrollbar;
  92.  
  93. }
  94.  
  95. void ui_scrollbar_do( UI_GADGET_SCROLLBAR * scrollbar, int keypress )
  96. {
  97.     int OnMe, OnSlider, keyfocus;
  98.  
  99.     int oldpos, op;
  100.  
  101.     keyfocus = 0;
  102.     keypress = keypress;
  103.  
  104.     if (CurWindow->keyboard_focus_gadget==(UI_GADGET *)scrollbar)
  105.         keyfocus = 1;
  106.  
  107.     if (scrollbar->start==scrollbar->stop)
  108.     {
  109.         scrollbar->position = 0;
  110.         scrollbar->fake_position = 0;
  111.         ui_draw_scrollbar( scrollbar );
  112.         return;
  113.     }
  114.  
  115.     op = scrollbar->position;
  116.  
  117.     oldpos = scrollbar->fake_position;
  118.  
  119.     scrollbar->moved = 0;
  120.  
  121.  
  122.     if ( (scrollbar->up_button->position!=0) || (keyfocus && keyd_pressed[KEY_UP]) )
  123.     {
  124.         if (TICKER > scrollbar->last_scrolled+1)
  125.         {
  126.             scrollbar->last_scrolled = TICKER;
  127.             scrollbar->position--;
  128.             if (scrollbar->position < scrollbar->start )
  129.                 scrollbar->position = scrollbar->start;
  130.             scrollbar->fake_position = scrollbar->position-scrollbar->start;
  131.             scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  132.             scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  133.         }
  134.     }
  135.  
  136.     if ( (scrollbar->down_button->position!=0) || (keyfocus && keyd_pressed[KEY_DOWN]) )
  137.     {
  138.         if (TICKER > scrollbar->last_scrolled+1)
  139.         {
  140.             scrollbar->last_scrolled = TICKER;
  141.             scrollbar->position++;
  142.             if (scrollbar->position > scrollbar->stop )
  143.                 scrollbar->position = scrollbar->stop;
  144.             scrollbar->fake_position = scrollbar->position-scrollbar->start;
  145.             scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  146.             scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  147.         }
  148.     }
  149.  
  150.     OnMe = ui_mouse_on_gadget( (UI_GADGET *)scrollbar );
  151.  
  152.     //gr_ubox(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
  153.  
  154.     if (!B1_PRESSED )
  155.         scrollbar->dragging = 0;
  156.  
  157.     //if (B1_PRESSED && OnMe )
  158.     //    listbox->dragging = 1;
  159.  
  160.  
  161.     OnSlider = 0;
  162.     if ((Mouse.y >= scrollbar->fake_position+scrollbar->y1) && \
  163.         (Mouse.y < scrollbar->fake_position+scrollbar->y1+scrollbar->fake_size) && OnMe )
  164.         OnSlider = 1;
  165.  
  166.     if (B1_JUST_PRESSED && OnSlider )
  167.     {
  168.         scrollbar->dragging = 1;
  169.         scrollbar->drag_x = Mouse.x;
  170.         scrollbar->drag_y = Mouse.y;
  171.         scrollbar->drag_starting = scrollbar->fake_position;
  172.     }
  173.  
  174.     if  ( B1_PRESSED && OnMe && !OnSlider && (TICKER > scrollbar->last_scrolled+4) )
  175.     {
  176.         scrollbar->last_scrolled = TICKER;
  177.  
  178.         if ( Mouse.y < scrollbar->fake_position+scrollbar->y1 )
  179.         {
  180.             // Page Up
  181.             scrollbar->position -= scrollbar->window_size;
  182.             if (scrollbar->position < scrollbar->start )
  183.                 scrollbar->position = scrollbar->start;
  184.  
  185.         } else {
  186.             // Page Down
  187.             scrollbar->position += scrollbar->window_size;
  188.             if (scrollbar->position > scrollbar->stop )
  189.                 scrollbar->position = scrollbar->stop;
  190.         }
  191.         scrollbar->fake_position = scrollbar->position-scrollbar->start;
  192.         scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  193.         scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  194.     }
  195.  
  196.     if ((selected_gadget==(UI_GADGET *)scrollbar) && B1_PRESSED && scrollbar->dragging )
  197.     {
  198.         //Mouse.x = scrollbar->drag_x;
  199.         scrollbar->fake_position = scrollbar->drag_starting + (Mouse.y - scrollbar->drag_y );
  200.         if (scrollbar->fake_position<0)
  201.         {
  202.             scrollbar->fake_position = 0;
  203.             //Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
  204.         }
  205.         if (scrollbar->fake_position > (scrollbar->height-scrollbar->fake_size))
  206.         {
  207.             scrollbar->fake_position = (scrollbar->height-scrollbar->fake_size);
  208.             //Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
  209.         }
  210.  
  211.         //mouse_set_pos( Mouse.x, Mouse.y );
  212.  
  213.         scrollbar->position = scrollbar->fake_position;
  214.         scrollbar->position *= (scrollbar->stop-scrollbar->start);
  215.         scrollbar->position /= ( scrollbar->height-scrollbar->fake_size ) ;
  216.         scrollbar->position += scrollbar->start;
  217.  
  218.         if (scrollbar->position > scrollbar->stop )
  219.             scrollbar->position = scrollbar->stop;
  220.  
  221.         if (scrollbar->position < scrollbar->start )
  222.             scrollbar->position = scrollbar->start;
  223.  
  224.         //scrollbar->fake_position = scrollbar->position-scrollbar->start;
  225.         //scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  226.         //scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  227.  
  228.     }
  229.  
  230.     if (op != scrollbar->position )
  231.         scrollbar->moved = 1;
  232.  
  233.     if (oldpos != scrollbar->fake_position)
  234.         scrollbar->status = 1;
  235.     ui_draw_scrollbar( scrollbar );
  236.  
  237. }
  238.  
  239.